package dataMining.apriori3;

/**
 * @author cuih
 * Date: 13-5-21
 */

import dataMining.apriori3.AprioriFrequentItemset;

import java.io.*;

public class Find_frequent_1 {
    boolean[][] DATA = AprioriFrequentItemset.DATA;                     //boolean表
    int sup_absolute = AprioriFrequentItemset.sup_absolute;            //阈值min_sup
    String inputFile = AprioriFrequentItemset.inputFile;               //输入文件
    String outputFile = AprioriFrequentItemset.outputFile;             //输出文件

    void find_frequent() throws IOException {
        int item[] = new int[120];   //记录扫面的个数,并且最终是一个候选项集
        for (int j = 0; j < 120; j++) {
            item[j] = 0;//初始化，防止泄漏（undefined）
        }
        int count = 0;//计算频繁项集的总个数

        //文件流I/O操作
        try {
            File inDataFile = new File(inputFile);// 定义输入文件流
            FileReader fileReader = new FileReader(inDataFile); // 将文件输入流构造到缓存
            BufferedReader bufferedReader = new BufferedReader(fileReader);  //将文件存入缓存区域中

            int character;    //读取的字符
            int lineNumber = 0;//lineNumber  行号
            int number = 0; //rowNumber   列号    列号码同时也表示该处的数值
            int step = 1;      //表示读取数据和处理数据的标志

            //给予每个item赋上值
            while ((character = bufferedReader.read()) != -1) {   //从缓冲区读取数据,直到缓冲区数据读取结束
                if (character == 32) {   //空格
                    step = 0;           //读取数据结束需要处理数据
                    item[number]++;
                    DATA[lineNumber][number] = true;//该处数据显示为true
                    number = 0;
                } else if (character == 10) { //换行
                    step = 0;
                    lineNumber++;       //换行
                    item[0]++;// 记录个数
                } else {
                    if (step == 1)           //读取数据没有结束 1表示两位数
                        number = character - 48;      //得到两位数
                    else if (step > 1)
                        number = number * 10 + (character - 48);  //、得到三位数
                }  //赋值成功
                step++;
            }
            bufferedReader.close();//从缓冲区内部读取结束
        } catch (IOException e) {    //捕获异常 ，并且抛出错误
            System.err.println(e);
        }

        File outDataFile = new File(outputFile);// 定义输出文件
        FileWriter ps = new FileWriter(outDataFile, true);
        ps.write("频繁1项集包括：\r\n");
        for (int i = 1; i < 120; i++) {
            if (item[i] >= sup_absolute) {
                ps.write(i + " ");  //将该数进行输出
                ps.write(":" + item[i] + "\r\n");    //写入数据
                count++;
            }else{
                item[i] = 0;//不是频繁项集的项支持度全部赋值为0
            }
        }
        ps.write("频繁1项集总计"+count+"个\r\n");
        ps.close();

        //如果需要大于1项集则向下继续调用
        if(AprioriFrequentItemset.K>1){
            //进入频繁2项集，进行继续操作
            Find_frequent_2 findFrequent2 = new Find_frequent_2();
            findFrequent2.find_frequent(item,2); //传进去一个频繁项集（构成形式是一维数组，为0非频繁），一个K项
        }
    }
}
